/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Conexao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;

/**
 *
 * @author fosa
 */
public class ConexaoDB {

    private String Gluser;
    private String Glpassword;
    private String Gllocal;
    private String Glbanco;
    private Statement Glconexão;
    private boolean conectado = false;

    public ConexaoDB() {
        this.Gluser = "";
        this.Glpassword = "";
        this.Gllocal = "";
        this.Glbanco = "";
    }

    public ConexaoDB(String Gluser, String Glpassword, String Gllocal, String Glbanco) {
        this.Gluser = Gluser;
        this.Glpassword = Glpassword;
        this.Gllocal = Gllocal;
        this.Glbanco = Glbanco;

//        connect();
    }

    public int connect() {
        int ret = 1;
        try {
            if (getGllocal().length() > 0) {
                Class.forName("com.mysql.jdbc.Driver").newInstance();

                Connection con = (Connection) DriverManager.getConnection("jdbc:mysql://" + getGllocal() + ":3306/" + getGlbanco(), getGluser(), getGlpassword());
                setGlconexão(con.createStatement());
                setConectado(true);
                System.out.println("Conex„o Estabelecida com SUCESSO");
            }
        } catch (InstantiationException ex) {
            setConectado(false);
            System.out.println("Houve erro no iniciando a conexão");
            ret = -1;
        } catch (IllegalAccessException ex) {
            setConectado(false);
            System.out.println("Houve erro no acessando a conexão");
            ret = -1;
        } catch (ClassNotFoundException ex) {
            setConectado(false);
            System.out.println("Houve erro  nao encontrou a conexão");
            ret = -1;
        } catch (SQLException e) {
            setConectado(false);
            System.out.println("Houve erro SQLException sem conexao ao banco de dados");
            e.printStackTrace();
            ret = -1;
        }
        return ret;
    }

    public Object[][][] consulta(String SQL) {
        Object[][][] retorno = null;
        if (isConectado()) {
            Statement stm = getGlconexão();

            retorno = new Object[2][2][2];

            try {
                Object[][] matriz;
                String[] titulo;

                System.out.println(SQL);
                ResultSet result = stm.executeQuery(SQL);
                ResultSetMetaData meta = result.getMetaData();

// vetor do titulo da tabela
                int NumCol = meta.getColumnCount();
                titulo = new String[NumCol];

                for (int i = 1; i <= NumCol; i++) {
                    titulo[i - 1] = (String) meta.getColumnLabel(i);
                }

                result.last();
                int numlinhas = result.getRow();
                result.first();

                //criando a matriz dos resultados
                matriz = new Object[numlinhas][NumCol];
                int j = 0;
                try {
                    do {
                        for (int i = 1; i <= NumCol; i++) {
                            matriz[j][i - 1] = result.getObject(i);
                        }
                        j++;
                    } while (result.next());
                } catch (java.lang.ArrayIndexOutOfBoundsException e) {
                    System.out.print("Consulta sem resultado");
                }

//            retorno = new RetornoConsulta();
//            retorno.SetObj(matriz);
//            retorno.SetStr(titulo);

                retorno[0][0] = titulo;
                retorno[1] = matriz;

            } catch (SQLException ex) {
                System.out.println("Houve erro na Consulta");
            } catch (NullPointerException ex) {
                System.out.println("Houve erro na Consulta nulo");
                ex.printStackTrace();
            }
        }
        return retorno;
    }

    public int Atualizar(String SQL) {
        if (isConectado()) {
            Statement stm = getGlconexão();

            int ret = 1;
            try {
                stm.executeUpdate(SQL);
                return ret;
            } catch (SQLException ex) {
                System.out.println("erro na atualização");
                ret = -1;
            }
        }
        return 0;
    }

    public int Inserir(String SQL) {
        int ret = 1;
        if (isConectado()) {
            try {
                System.out.println(SQL);
                getGlconexão().execute(SQL);
            } catch (SQLException ex) {
                System.out.println("erro na inserçao");
                ret = -1;
            }
        }
        return ret;
    }

    /**
     * @return the Gluser
     */
    public String getGluser() {
        return Gluser;
    }

    /**
     * @param Gluser the Gluser to set
     */
    public void setGluser(String Gluser) {
        this.Gluser = Gluser;
    }

    /**
     * @return the Glpassword
     */
    public String getGlpassword() {
        return Glpassword;
    }

    /**
     * @param Glpassword the Glpassword to set
     */
    public void setGlpassword(String Glpassword) {
        this.Glpassword = Glpassword;
    }

    /**
     * @return the Gllocal
     */
    public String getGllocal() {
        return Gllocal;
    }

    /**
     * @param Gllocal the Gllocal to set
     */
    public void setGllocal(String Gllocal) {
        this.Gllocal = Gllocal;
    }

    /**
     * @return the Glconexão
     */
    public Statement getGlconexão() {
        return Glconexão;
    }

    /**
     * @param Glconexão the Glconexão to set
     */
    public void setGlconexão(Statement Glconexão) {
        this.Glconexão = Glconexão;
    }

    /**
     * @return the Glbanco
     */
    public String getGlbanco() {
        return Glbanco;
    }

    /**
     * @param Glbanco the Glbanco to set
     */
    public void setGlbanco(String Glbanco) {
        this.Glbanco = Glbanco;
    }

    /**
     * @return the conectado
     */
    public boolean isConectado() {
        return conectado;
    }

    public String isConectadoS() {
        if (isConectado()) {
            return "Conectado";
        } else {
            return "Não Conectado";
        }
    }

    /**
     * @param conectado the conectado to set
     */
    public void setConectado(boolean conectado) {
        this.conectado = conectado;
    }
}
